//  布尔值
// var\let:定义变量

var flag: boolean = true
flag = false
// flag = 2 非布尔类型的语言，不能赋值给布尔类型

// 数字型
let num1: number = 10
let num2: number = 0.5

// 字符串
let str: string = "hello string"
// 模版字符串 ``反引号 ${}数据填充
let username: string = "张三"
let age: number = 20

console.log(`我是${username},今年${age}岁`);

// undefined 和 null
let un: undefined = undefined
let nu: null = null

let num: number = undefined
let str1: string = null

// undefined 和 null定的类型，只能赋值符合自己的类型，
// 但是undefined 和 null可以赋值给其他类型的变量

// 数组(必须符合规定的类型)
let arr1: number[] = [1,2,3]
let str2: string[] = ["hi", "hello"]
let arr2: Array<number> = [4,5,6]

// 元组（各种类型不相同的元素）
let arr3: [number, string] = [1, "hello"]

// 枚举 enum,就是给一组数值赋予一个好听的名字
// 默认情况下，枚举的编号从0开始，也可以手动修改
enum Color {
    Red = 2,
    Yellow,
    Blue
}

let myColor: Color = Color.Red
console.log(myColor, Color.Yellow, Color.Blue)
// 取出枚举的对象,通过编号取值
let colorName: string = Color[2]
console.log(colorName)

// any 泛型：不清楚设置哪个类型，可以设置任何类型
let notType: any = 1
notType = "hello"
notType = true
let arr4: any[] = [1, "hi", false]

// void 类型和any类型相反，表示没有任何类型
function test():number {
    return 1
}
function test98():void {
    // return 1 //error
    // return null //ok
    // return undefined //ok
    console.log(111)
}

//object 类型 它是非原始类型,除了number,string,boolean之外的类型
let obj:object = undefined
let obj2:object = null
let obj3:object = [1,2,3]
let obj4:object = {name:"张三"}

//联合类型：多种类型取一种类型
function test100(params:number | string | boolean){
    return params +"typescript"
}

console.log(test100("hello"));
console.log(test100(123));
console.log(test100(true));

//类型断言：相当于类型转换
//第一种通过<数据类型>变量、参数
//第二种通过变量、参数 as 数据类型

//TS的类型断言只在编译阶段起作用，但对运行结果没有任何影响，不进行特殊的数据检查和解构
//相当于欺骗了TS的代码检查，是一个假的类型转换，只是为了不被报错，没有实际性的类型转换作用
function test4(params:Number | String){
    //取出传出去的参数的长度
    // 数据类型时没有长度length的属性
    if((<string>params).length){
        return (params as string).length
    }else{
        return params.toString().length
    }
 }
//  test4("hello")
 console.log(test4(1234));

//类型推断
//定义变量第一次赋值是什么类型，那么就会默认推断出变量为该类型
let count = 123
// count = "hello"

//定义变量第一次如果没有赋值，那么就会默认推断出变量为any类型（支持任何类型）
let a
a=1
a="hi"
a=true
a=[1,2]